export async function getAllListElements(): Promise<void> {
    const maxAttempts = 10;
    const delay = 500; // 500ms 延迟
    
    for (let attempt = 0; attempt < maxAttempts; attempt++) {
        const reactElements = document.querySelectorAll('[role="grid"] [role="listitem"]');
        let foundFiber = false;
        
        for (let element of reactElements) {
            const fiberKey = Object.keys(element).find(key => key.startsWith('__reactFiber$'));
            
            if (fiberKey) {
                foundFiber = true;
                const fiber = (element as any)[fiberKey];
                
                if (fiber && 
                    fiber.memoizedProps && 
                    fiber.memoizedProps.children && 
                    fiber.memoizedProps.children.props && 
                    fiber.memoizedProps.children.props.children && 
                    fiber.memoizedProps.children.props.children.props && 
                    fiber.memoizedProps.children.props.children.props.children &&
                    fiber.memoizedProps.children.props.children.props.children.props &&
                    fiber.memoizedProps.children.props.children.props.children.props.chat) {
                    
                    const chat = fiber.memoizedProps.children.props.children.props.children.props.chat;
                    
                    // 设置聊天ID
                    if (chat.__x_id && chat.__x_id._serialized) {
                        element.setAttribute('data-kiki-chat-id', chat.__x_id._serialized);
                    }
                    
                    // 设置聊天标题
                    if (chat.__x_formattedTitle) {
                        element.setAttribute('data-kiki-chat-title', chat.__x_formattedTitle);
                    }
                }
            }
        }
        
        // 如果找到了 Fiber 属性，说明元素已经渲染完成
        if (foundFiber) {
            console.log(`成功获取 Fiber 属性，尝试次数: ${attempt + 1}`);
            return;
        }
        
        // 如果还没有找到 Fiber 属性，等待一段时间后重试
        console.log(`未找到 Fiber 属性，等待 ${delay}ms 后重试 (${attempt + 1}/${maxAttempts})`);
        await new Promise(resolve => setTimeout(resolve, delay));
    }
    
    console.warn('在最大尝试次数内未能获取 Fiber 属性');
}

// 定义一个在页面上下文中执行的函数
function executeInPageContext(fn: Function) {
    const script = document.createElement('script');
    script.textContent = `(${fn.toString()})();`;
    document.documentElement.appendChild(script);
    script.remove();
}

// 注入脚本到页面
function injectFiberScript() {
    // 检查是否已经注入过
    if (document.getElementById('kikimami-fiber-script-injected')) {
        // console.log('脚本已注入，跳过');
        return;
    }
    
    // 创建一个标记元素以避免重复注入
    const marker = document.createElement('div');
    marker.id = 'kikimami-fiber-script-injected';
    marker.style.display = 'none';
    document.body.appendChild(marker);
    
    try {
        // 获取扩展中可访问资源的URL
        const scriptURL = chrome.runtime.getURL('whatsapp-injected.js');
        
        // 创建script元素
        const script = document.createElement('script');
        script.src = scriptURL;
        script.onload = function() {
            // 脚本加载后自动移除
            script.remove();
            console.log('WhatsApp Fiber脚本加载成功');
        };
        
        // 将脚本添加到页面
        (document.head || document.documentElement).appendChild(script);
        
        // 设置与注入脚本的通信
        window.addEventListener('message', function(event) {
            // 处理来自注入脚本的消息
            if (event.data && event.data.type === 'FROM_WHATSAPP_INJECTED_SCRIPT') {
                console.log('收到注入脚本消息:', event.data);
            }
        });
        
        // 通知注入的脚本
        setTimeout(() => {
            window.postMessage({
                type: 'FROM_KIKIMAMI_EXTENSION',
                action: 'GET_FIBER_DATA'
            }, '*');
        }, 1000);
        
    } catch (error) {
        console.error('注入WhatsApp Fiber脚本失败:', error);
    }
}

/**
 * 从WhatsApp的React树中获取当前登录用户的账号ID
 * 使用广度优先搜索查找包含__x_originalSelfAuthor或__x_me=true的节点
 * @returns Promise<用户账号ID (_serialized格式，通常为 手机号@c.us)>
 */
export function getCurrentWhatsAppUserId(): Promise<string | null> {
    return new Promise((resolve) => {
        try {
            console.log('开始查找WhatsApp用户账号ID...');
            
            // 创建一个唯一ID，用于识别这次请求
            const requestId = 'getUserId_' + Date.now();
            
            // 设置一个监听器，用于接收页面上下文发送的消息
            const messageListener = (event: MessageEvent) => {
                if (event.data && 
                    event.data.type === 'FROM_WHATSAPP_PAGE_CONTEXT' && 
                    event.data.action === 'getUserId' &&
                    event.data.requestId === requestId) {
                    
                    // 收到消息后移除监听器
                    window.removeEventListener('message', messageListener);
                    
                    const userId = event.data.userId;
                    if (userId) {
                        console.log(`%c成功获取用户账号ID!: ${userId}`, 'color:green;font-weight:bold');
                        resolve(userId);
                    } else {
                        console.log('%c未能找到用户账号ID', 'color:red;font-weight:bold');
                        resolve(null);
                    }
                }
            };
            
            // 添加消息监听器
            window.addEventListener('message', messageListener);
            
            // 设置超时，避免永远等待
            const timeoutId = setTimeout(() => {
                window.removeEventListener('message', messageListener);
                console.log('%c获取用户ID超时', 'color:red;font-weight:bold');
                resolve(null);
            }, 10000); // 10秒超时
            
            // 获取扩展中可访问资源的URL
            const scriptURL = chrome.runtime.getURL('whatsapp-userid.js');
            
            // 创建script元素并设置请求ID
            const script = document.createElement('script');
            script.src = scriptURL;
            script.setAttribute('data-request-id', requestId);
            script.onload = function() {
                // 脚本加载后自动移除
                script.remove();
            };
            
            // 将脚本添加到页面
            (document.head || document.documentElement).appendChild(script);
            
        } catch (error) {
            console.error('获取用户账号ID过程中发生错误:', error);
            resolve(null);
        }
    });
}

// 导出函数
export { injectFiberScript };